// //  装饰模式  动态地给一个对象增加一些额外的职责。就增加功能而言，Decorator模式比生成子类更为灵活。
// a)通过采用组合、而非继承的手法， Decorator模式实现了在运行时动态地扩展对象功能的能力，
// 而且可以根据需要扩展多个功能。避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。
// b)Component类在Decorator模式中充当抽象接口的角色，不应该去实现具体的行为。而且Decorator类对于Component类应该透明——
//换言之Component类无需知道Decorator类，Decorator类是从外部来扩展Component类的功能。
// c)Decorator类在接口上表现为is-a Component的继承关系，即Decorator类继承了Component类所具有的接口。
//但在实现上又表现为has-a Component的组合关系，即Decorator类又使用了另外一个Component类。我们可以使用一个或者多个Decorator对象来“装饰”一个Component对象，且装饰后的对象仍然是一个Component对象。
// d)Decorator模式并非解决“多子类衍生的多继承”问题，Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。

class Request {
  ajax() {
    return new Promise((resolve, reject) => {
      console.log("进行ajax请求")
      resolve()
    });
  }
}

class RequestWithLog {
  constructor() {
    this.request = new Request();
  }

  ajax() {
    console.log("开始ajax请求")
    return this.request.ajax().then(() => {
      console.log("结束ajax请求")
      return '结束了'
    })
  }
}

var r = new RequestWithLog();
r.ajax().then((data) => {
  console.log(data)
}); 